import json
import os
import time
import uuid

from file_manage.file import File
from logger import logger
from drill_script.pdf_generator import DrillScriptPDFGenerator


class DrillScriptSaver:
    """演练脚本保存器"""
    
    def __init__(self, equipment: str, scene_desc: str, plan: dict, script_node: list):
        """
        初始化保存器
        
        Args:
            equipment: 设备
            scene_desc: 场景描述
            plan: 应急预案
            script_node: 脚本节点
        """
        self.equipment = equipment
        self.scene_desc = scene_desc
        self.plan = plan
        self.script_node = script_node
    
    def generate_script_content(self):
        """
        生成脚本内容文本
        
        Returns:
            格式化的脚本内容
        """
        content_parts = []
        
        # 添加标题
        content_parts.append(f"# {self.equipment} - {self.scene_desc} 演练脚本")
        content_parts.append("")
        
        # 添加应急预案信息
        content_parts.append("## 应急预案信息")
        for field_name, field_content in self.plan.items():
            content_parts.append(f"### {field_name}")
            content_parts.append(field_content)
            content_parts.append("")
        
        # 添加演练脚本
        content_parts.append("## 演练脚本")
        
        for node in self.script_node:
            content_parts.append(f"### {node.get('nodeName', '未命名节点')}")
            content_parts.append(f"节点类型: {node.get('nodeType', '未知')}")
            content_parts.append(f"节点顺序: {node.get('nodeOrder', 0)}")
            content_parts.append("")
            
            # 处理子节点
            children = node.get('children', [])
            for i, child in enumerate(children, 1):
                content_parts.append(f"#### 子节点 {i}: {child.get('nodeName', '未命名')}")
                content_parts.append(f"节点类型: {child.get('nodeType', '未知')}")
                content_parts.append(f"节点ID: {child.get('id', '未知')}")
                content_parts.append("")
                
                # 添加节点内容
                node_content = child.get('nodeContent', '')
                if node_content:
                    content_parts.append("**节点内容:**")
                    content_parts.append(node_content)
                    content_parts.append("")
                
                # 添加参与者信息
                participants = child.get('participants', {})
                if participants:
                    content_parts.append("**参与者信息:**")
                    content_parts.append(f"- 姓名: {participants.get('name', '未知')}")
                    content_parts.append(f"- 组名: {participants.get('groupName', '未知')}")
                    content_parts.append(f"- 组ID: {participants.get('groupId', '未知')}")
                    content_parts.append("")
            
            content_parts.append("---")
            content_parts.append("")
        
        return "\n".join(content_parts)
    
    async def save_to_knowledge_base(self):
        """
        保存脚本到知识库
        
        Returns:
            保存结果信息
        """
        # 记录保存开始时间
        save_start_time = time.time()
        
        try:
            print(f"🔍 DrillScriptSaver开始保存脚本")
            print(f"🔍 设备: {self.equipment}")
            print(f"🔍 场景描述: {self.scene_desc}")
            print(f"🔍 预案字段数: {len(self.plan)}")
            print(f"🔍 脚本节点数: {len(self.script_node)}")
            
            # 记录PDF生成开始时间
            pdf_start_time = time.time()
            
            # 生成PDF文件
            pdf_generator = DrillScriptPDFGenerator()
            pdf_bytes = pdf_generator.generate_pdf_bytes(
                self.equipment,
                self.scene_desc,
                self.plan,
                self.script_node
            )
            
            pdf_end_time = time.time()
            pdf_duration = pdf_end_time - pdf_start_time
            print(f"🔍 生成的PDF文件大小: {len(pdf_bytes)} 字节")
            print(f"⏱️ PDF生成耗时: {pdf_duration:.3f}秒")
            
            # 生成文件ID和文件名
            timestamp = int(time.time())
            file_id = f"drill_script_{self.equipment}_{timestamp}"
            file_name = f"{self.equipment}-{self.scene_desc}演练脚本.pdf"
            
            print(f"🔍 文件ID: {file_id}")
            print(f"🔍 文件名: {file_name}")
            
            # 创建File对象
            file_obj = File(
                file_id=file_id,
                file_name=file_name,
                permission_type=1,  # 默认所有人可访问
                permission_set=[],  # 默认所有人可访问
                file=pdf_bytes,  # 使用PDF字节数据
                file_path=None  # 使用字节数据而不是文件路径
            )
            
            # 记录文件处理开始时间
            file_process_start_time = time.time()
            
            # 检测文件类型
            file_type = file_obj.detect_file_type()
            if not file_type:
                raise Exception("文件类型检测失败")
            
            print(f"🔍 检测到文件类型: {file_type}")
            
            # 保存文件并提取内容
            file_obj.file_save()
            print(f"🔍 开始提取文件内容...")
            await file_obj.file_extract(file_type, use_simple_extract=True)  # 使用简化的PDF提取
            print(f"🔍 文件内容提取完成，内容长度: {len(file_obj.content) if file_obj.content else 0}")
            print(f"🔍 开始文本分块...")
            file_obj.content_trunk()
            print(f"🔍 文本分块完成，块数: {len(file_obj.trunks) if file_obj.trunks else 0}")
            
            file_process_end_time = time.time()
            file_process_duration = file_process_end_time - file_process_start_time
            print(f"⏱️ 文件处理耗时: {file_process_duration:.3f}秒")
            
            # 记录ES上传开始时间
            es_start_time = time.time()
            
            # 上传到Elasticsearch
            print(f"🔍 开始上传到Elasticsearch...")
            print(f"🔍 文件ID: {file_id}")
            print(f"🔍 文件名: {file_name}")
            print(f"🔍 文本块数: {len(file_obj.trunks) if file_obj.trunks else 0}")
            
            try:
                await file_obj.upload_to_es()
                print(f"✅ ES上传成功")
            except Exception as e:
                print(f"❌ ES上传失败: {e}")
                import traceback
                traceback.print_exc()
                raise e
            
            es_end_time = time.time()
            es_duration = es_end_time - es_start_time
            print(f"⏱️ ES上传耗时: {es_duration:.3f}秒")
            
            # 记录保存结束时间
            save_end_time = time.time()
            save_duration = save_end_time - save_start_time
            
            print(f"✅ 脚本保存成功")
            print(f"⏱️ 保存总体耗时: {save_duration:.3f}秒")
            print(f"📊 保存耗时分析:")
            print(f"   - PDF生成: {pdf_duration:.3f}秒 ({(pdf_duration/save_duration)*100:.1f}%)")
            print(f"   - 文件处理: {file_process_duration:.3f}秒 ({(file_process_duration/save_duration)*100:.1f}%)")
            print(f"   - ES上传: {es_duration:.3f}秒 ({(es_duration/save_duration)*100:.1f}%)")
            
            return {
                "file_id": file_id,
                "file_name": file_name,
                "content_length": len(pdf_bytes)
            }
            
        except Exception as e:
            print(f"❌ 脚本保存失败: {e}")
            import traceback
            traceback.print_exc()
            raise e 